Este principio consiste en que cuando dos objetos están relacionados, ninguno tiene dependencia del otro, los dos dependen en una abstracción que une a las dos clases.
Si tenemos una clase Boton y na clase Bombilla en la que el boton se encarga de decidir si la bombilla está encendida o no, en este caso la clase Boton tendría dependencia de Bombilla si lo implementamos tal que así:
Clase main:
public class main {
public static void main(String[] args) {
Bombilla bombilla = new Bombilla();
Boton boton = new Boton(bombilla);
boton.pulsarBoton();
boton.pulsarBoton();
}
}
Clase Boton:
public class Boton {
Bombilla bombilla = new Bombilla() ;
private boolean activado = true;
Boton(Bombilla bombilla){
this.bombilla = bombilla;
}
public void pulsarBoton(){
if (activado){
activado = !activado;
bombilla.apagarLuz();
}
else{
activado = !activado;
bombilla.encenderLuz();
}
}
}
Clase Bombilla:
public class Bombilla {
public void encenderLuz(){
System.out.println(("Luz encendida"));
}
public void apagarLuz(){
System.out.println(("Luz apagada"));
}
}
En este ejemplo la clase Boton es dependiente de Bombilla lo que hace que no podamos reutilizar la clase boton con otros objetos o incluso que si la clase Bombilla cambia esto podría afectar a la clase Boton.
Para cumplir con el principio DIP, añadiremos una interfaz entre las dos clases, de manera que ninguna de las dos clases dependerá de la otra, si no que las dos dependerán de la propia interfaz:
Clase main:
public class main {
public static void main(String[] args) {
Bombilla bombilla = new Bombilla();
Boton boton = new Boton();
boton.pulsarBoton(bombilla);
boton.pulsarBoton(bombilla);
}
}
Clase Boton:
public class Boton {
private boolean activado = true;
public void pulsarBoton(Interruptor dispositivo){
if (activado){
activado = !activado;
dispositivo.apagar();
}
else{
activado = !activado;
dispositivo.encender();
}
}
}
Clase Bombilla:
public class Bombilla implements Interruptor {
public void encender(){
System.out.println(("Luz encendida"));
}
public void apagar(){
System.out.println(("Luz apagada"));
}
}
Interfaz Interruptor:
public interface Interruptor {
public void encender();
public void apagar();
}
En este ejemplo, Boton usa la interfaz interruptor para acceder a los metodos que tendrán las clases que implementen dicha interfaz, y Bombilla implementa la interfaz interruptor
SOLID | Dependency Inversion